// 文件名：unordered_set_crawler_dedupe.cpp
// 目的：模拟爬虫抓取队列的去重处理：从 frontier 拉取 URL，使用 visited 集合避免重复抓取。
// 设计：
//   - frontier：使用 deque 作为待抓取队列（支持头部弹出、尾部推入）；
//   - visited：unordered_set<string> 记录已抓取 URL，insert 返回值 second 标识是否为新 URL；
//   - processed：按抓取顺序记录已处理 URL（便于后续统计/输出）。
// 性能：
//   - visited.reserve(1024) 预估容量减少 rehash；
//   - 将 frontier.front() move 出队列，避免不必要拷贝。
// 扩展：
//   - 解析页面后可将新发现 URL 追加到 frontier（此处仅注释说明）。

#include <deque>
#include <iostream>
#include <string>
#include <unordered_set>
#include <vector>

int main() {
    std::deque<std::string> frontier = {
        "https://news.example.com/",
        "https://news.example.com/world",
        "https://news.example.com/",
        "https://news.example.com/politics",
        "https://news.example.com/world"
    };

    std::unordered_set<std::string> visited;
    visited.reserve(1024);

    std::vector<std::string> processed;

    while (!frontier.empty()) {
        std::string url = std::move(frontier.front());
        frontier.pop_front();

        if (!visited.insert(url).second) {
            continue; // 已抓取，跳过
        }

        processed.push_back(url);
        // 这里可根据页面解析结果向 frontier 推入更多 URL
    }

    std::cout << "Processed URLs:\n";
    for (const auto& url : processed) {
        std::cout << "  " << url << '\n';
    }

    std::cout << "Visited count: " << visited.size() << '\n';
    return 0;
}